package com.adopapa.nezhacloud.register.service;

import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort.Order;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;

import com.adopapa.nezhacloud.common.Tools;
import com.adopapa.nezhacloud.ddd.service.BaseDomainService;
import com.adopapa.nezhacloud.register.domain.StudyStat;
import com.adopapa.nezhacloud.register.domain.StudyStatRepository;

import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.persistence.criteria.Predicate;
import jakarta.persistence.criteria.Root;


@Service
public class StudyStatService extends BaseDomainService<StudyStat> {

	@Autowired
	private StudyStatRepository studyStatRepository;

	public StudyStat getStudyStatById(String id) {
		Optional<StudyStat> optional = studyStatRepository.findById(id);
		return optional.isPresent() ? optional.get() : null;
	}
	
	public StudyStat getStudyStatByUserId(String userId) {
		List<StudyStat> results = studyStatRepository.findByUserId(userId);
		return Tools.empty(results) ? null : results.get(0);
	}
	public StudyStat getStudyStatByCellphone(String cellphone) {
		List<StudyStat> results = studyStatRepository.findByCellphone(cellphone);
		return Tools.empty(results) ? null : results.get(0);
	}

	public Page<StudyStat> getStudyStatPage(int pageNo, int pageSize, StudyStat studyStat) {
		PageRequest pageRequest = buildPageRequest(pageNo, pageSize, Order.desc("createTime"));
		Specification<StudyStat> specification = buildSpecification(studyStat);
		Page<StudyStat> page = studyStatRepository.findAll(specification, pageRequest);
		return page;
	}

	public StudyStat saveStudyStat(StudyStat studyStat) {
		return studyStatRepository.saveAndFlush(studyStat);
	}

	public List<StudyStat> saveStudyStats(List<StudyStat> studyStats) {
		return studyStatRepository.saveAllAndFlush(studyStats);
	}

	public void deleteStudyStat(String id) {
		studyStatRepository.deleteById(id);
	}

	public void deleteStudyStat(StudyStat studyStat) {
		studyStatRepository.delete(studyStat);
	}

	public void deleteStudyStats(String... ids) {
		studyStatRepository.deleteAllByIdInBatch(Arrays.asList(ids));
	}

	public void deleteStudyStats(List<StudyStat> studyStats) {
		studyStatRepository.deleteAllInBatch(studyStats);
	}

	@SuppressWarnings("serial")
	@Override
	public Specification<StudyStat> buildSpecification(StudyStat studyStat) {
		return new Specification<StudyStat>() {
			@Override
			public Predicate toPredicate(Root<StudyStat> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
				List<Predicate> predicates = new LinkedList<>();
				if (!Tools.empty(studyStat.getUserId())) {
					predicates.add(cb.like(root.get("userId"), //
						"%".concat(studyStat.getUserId()).concat("%")));
				}
				if (!Tools.empty(studyStat.getNickName())) {
					predicates.add(cb.like(root.get("nickName"), //
						"%".concat(studyStat.getNickName()).concat("%")));
				}
				if (!Tools.empty(studyStat.getCollectCode())) {
					predicates.add(cb.equal(root.get("collectCode"), //
						studyStat.getCollectCode()));
				}
				if (!Tools.empty(studyStat.getItemName())) {
					predicates.add(cb.like(root.get("itemName"), //
						"%".concat(studyStat.getItemName()).concat("%")));
				}
				if (!Tools.empty(studyStat.getCourseType())) {
					predicates.add(cb.equal(root.get("courseType"), //
						studyStat.getCourseType()));
				}
				if (!Tools.empty(studyStat.getAmountToSec())) {
					predicates.add(cb.equal(root.get("amountToSec"), //
						studyStat.getAmountToSec()));
				}
				if (!Tools.empty(studyStat.getProgress())) {
					predicates.add(cb.equal(root.get("progress"), //
						studyStat.getProgress()));
				}
				if (!Tools.empty(studyStat.getCourseEnded())) {
					predicates.add(cb.equal(root.get("courseEnded"), //
						studyStat.getCourseEnded()));
				}
				if (!Tools.empty(studyStat.getRegisted())) {
					predicates.add(cb.equal(root.get("registed"), //
						studyStat.getRegisted()));
				}
				if (!Tools.empty(studyStat.getStartTime())) {
					predicates.add(cb.equal(root.get("startTime"), //
							studyStat.getStartTime()));
				}
				if (!Tools.empty(studyStat.getValidTimeSec())) {
					predicates.add(cb.equal(root.get("validTimeSec"), //
						studyStat.getValidTimeSec()));
				}
				if (!Tools.empty(studyStat.getEndTime())) {
					predicates.add(cb.equal(root.get("endTime"), //
						studyStat.getEndTime()));
				}
				if (!Tools.empty(studyStat.getCellphone())) {
					predicates.add(cb.equal(root.get("cellphone"), //
						studyStat.getCellphone()));
				}
				if (!Tools.empty(studyStat.getName())) {
					predicates.add(cb.like(root.get("name"), //
						"%".concat(studyStat.getName()).concat("%")));
				}
				return cb.and(predicates.toArray(new Predicate[0]));
			}

		};
	}
	
	// predicates.add(cb.equal(cb.substring(root.get("datagram"), 1, 23), dataPrefix));

}
